package com.snopy.designPattern.create.singleton;

import java.io.Serializable;

/**
 * @author snopy
 * @version 1.0.0
 * @classname SingletonA
 * @description 饿汉式
 * @email 77912204@qq.com
 * @date 2022/06/27 15:31
 */
//问题1:为什么加final
    /*
    * 防止被子类继承，覆盖了里面的方法，破坏单例
    * */
//问题2：如果实现了序列化接口，需要做什么来防止反序列化破坏单例
    /*
    * 添加private Object readResolve(){ return instance;} 防止反序列化是通过反射创建新的对象
    * */
public final class SingletonA implements Serializable {
//    问题3：为什么设置私有？是否能防止反射创建新的实例
    /*
    *  设置为私有可以防止直接new创建对象
    *  私有构造器不能防止反射创建新的实例,反射可以通过获取私有构造器，设置setAccessible(true),暴力构建对象
    * */
    private SingletonA() {
    }
    //问题4：这样初始化能否保证单例对象创建时的线程安全？
    /*
    * 可以，静态变量创建，是在类加载的时候，所以由jvm执行clinit()方法保证静态变量，静态语句块 同一个类型加载器下只会被初始化一次
    * */
    private static final SingletonA INSTANCE = new SingletonA();
    //问题5：为什么提高静态方法，而不是直接将INSTANCE 设置为public，说出你知道的理由
    /*
    * 1.使用静态方法，便于对单例对象做一些内部的封装
    * 2.使用方法，可以应用不同的模式，比如懒汉模式，如果直接暴露，就不能有这样的应用
    * 3.可以提供一些泛型的支持，直接使用public就不能使用泛型
    * */
    public static SingletonA getInstance(){
        return INSTANCE;
    }

    private Object readResolve(){
        return INSTANCE;
    }
}
